Модуль:Бездна
WARFRAME Wiki Таблица Реликвий --http://warframe.fandom.com/ru --Написано пользователем:ChickenBar с EN wiki (Written by User:ChickenBar from EN wiki) --Локализовано на русский User:Max.Archy (Rus localization by User:Max.Archy) --Из-за особенностей языка применение русских символов в переменных функций не допускается local p = {} --здесь и далее пометки об исходных именах local VoidData = mw.loadData( 'Модуль:Бездна/Данные' ) --Void/data local Icon = require( "Модуль:Иконки" ) --Module:Icon local Shared = require( "Модуль:БазаФункций" ) --Module:Shared local TxtColors = {Common = '#9C7344', Uncommon = '#D3D3D3', Rare = '#D1B962'} local tooltipStart = "" local tooltipEnd = "" -- Дополняет название окончанием "Прайм" за исключением Формы -- Позволяет базу данных заполнять без этой приписки >>>>>>>>>а надо ли? -- Например, "Латрон" преобразует в "Латрон Прайм" function p.getItemName(itemStr) caseItem = string.gsub(itemStr, "(%a)(%w_'*)", Shared.titleCase) if(itemStr ~= "ФОРМА") then caseItem = caseItem.." Прайм" end return caseItem end -- Преобразует название части (Converts part names in data to proper casing) function p.getPartName(partStr, keepBlueprint) --Дополнение пользователя: --User:Falterfire 6/19/2018: -- New parameter to remove ' Blueprint' if wanted -- IE returns 'Neuroptics' instead of 'Neuroptics Blueprint' if keepBlueprint nil then keepBlueprint = true end local result = string.gsub(partStr, "(%a)(%w_'*)", Shared.titleCase) if not keepBlueprint and Shared.contains(result, ' Blueprint') then result = string.gsub(result, ' Blueprint', ) end return result end --Получение Реликвии с определенным названием в базе "Бездна/Данные" function p.getRelic(Tier, Name) for i, relic in pairs(VoidData"Relics") do if (relic.Tier Tier and relic.Name Name) then return relic end end return nil end --На текущий момент все реликвии совпадают на всех платформах --Задел на будущее, если появятся расхождения в Реликвиях по разным платформам function p.isRelicOnPlatform(Relic, Platform) local Platforms = Relic.Platforms if(Platforms nil) then return true else local foundIt = false for i, plat in pairs(Platforms) do if (plat Platform) then foundIt = true end end return foundIt end end --Возвращает Категорию редкости выпадения элемента списка выпадения реликвии, --если это часть или чертеж, иначе возвращает "пусто" function p.getRelicDropRarity(Relic, item, part) for i, drop in pairs(Relic.Drops) do if ( drop.Item item and drop.Part part) then return drop.Rarity end end return nil end --Возвращает иконку элемента --(например, при входных данных Брэйтон Прайм Ствол вернет Прайм_Ствол_иконка) function p.getPartIconForDrop(drop) local iName = p.getItemName(drop.Item) local pName = p.getPartName(drop.Part) local iconSize ='50' local primeToggle = '_Прайм' if iName 'Одоната Прайм' then if pName 'Упряж' or pName 'Система' or pName 'Крылья' then primeToggle = '_Арчвинг' --'Archwing ' end -- elseif pName 'Carapace' or pName 'Cerebrum' or pName 'Systems' then -- primeToggle = '' end local icon = if(pName 'Чертеж') then --'Blueprint' icon = Icon._Prime(Shared.titleCase(drop.Item), nil,iconSize) elseif iName 'Каваса Прайм' then --'Kavasa Prime' icon = Icon._Prime('Каваса Прайм', nil,iconSize) --'Kavasa' else icon = Icon._Item(pName..primeToggle,"",iconSize) end return icon end --Возвращает наименование для иконки Оружия, Варфрейма и т.д. --(например, при входных данных Брэйтон Прайм Ствол вернет Брэйтон_Прайм) function p.getItemIconForDrop(drop) local iName = p.getItemName(drop.Item) local pName = p.getPartName(drop.Part) local iconSize ='40' local icon ='' icon = Icon._Prime(Shared.titleCase(drop.Item), nil, iconSize) return icon end function p.item(frame) local platform = frame.args1 local item_type = frame.args2 local item_part = frame.args3 local relic_tier = frame.args4 return p._item(item_type,item_part,relic_tier,platform) end ---------------------------------------------------------- --ПРОПИСАТЬ ПЕРЕНАЗНАЧЕНИЕ ДЛЯ ПРОЧИХ ЭЛЕМЕНТОВ ЧАСТЕЙ!!!! --Ж--Ж-ЖЖЖ----ЖЖ---Ж--ЖЖЖ-Ж---Ж-ЖЖЖЖЖ-Ж----Ж-Ж-Ж --Ж--*-Ж-----Ж--Ж-Ж-Ж-Ж---Ж---Ж---Ж---Ж----Ж-Ж-Ж --ЖЖЖЖ-ЖЖЖ-----Ж--ЖЖЖ-ЖЖЖ-ЖЖЖ-Ж---Ж---ЖЖЖ--Ж-Ж-Ж --Ж--Ж-Ж-----Ж--Ж-Ж-Ж-Ж-Ж-Ж-Ж-Ж---Ж---Ж-Ж------- --Ж--Ж-ЖЖЖ----ЖЖ--Ж-Ж-ЖЖЖ-ЖЖЖ-Ж---Ж---ЖЖЖ--Ж-Ж-Ж ---------------------------------------------------------- function p._item(item_type,item_part,relic_tier,platform) item_type = string.upper(item_type) item_part = string.upper(item_part) --- if (item_part "HELMET BLUEPRINT") then --- item_part = "NEUROPTICS BLUEPRINT" --- end --пока что уберу, так как наименования Шлем не должно быть local locations = {} local vaultLocations = {} local i for i, relic in pairs(VoidData"Relics") do --Русификация???? <<<<<<<<<<<<<<< if(p.isRelicOnPlatform(relic, platform) and (relic_tier nil or relic.Tier relic_tier)) then local dropRarity = p.getRelicDropRarity(relic, item_type, item_part) if(dropRarity ~= nil) then local relicText = relic.Tier.." "..relic.Name local relicString = tooltipStart..relicText..tooltipCenter..""..relicText..""..tooltipEnd.." "..dropRarity if(relic.IsVaulted 1) then relicString = relicString.." (Пр.хр.)" --Prime Vault|V table.insert(vaultLocations, relicString) else if(relic.IsBaro 1) then relicString = relicString.." (Баро)" --Baro Ki%27Teer|B end table.insert(locations, relicString) end end end end for _, i in pairs(vaultLocations) do table.insert(locations, i) end return table.concat(locations, " ") end function p.relicTooltip(frame) local relicName = frame.args ~= nil and frame.args1 or frame local platform = frame.args ~= nil and frame.args2 if(platform nil) then platform = 'PC' end if(relicName nil) then return nil end local bits = Shared.splitString(relicName, ' ') local Tier = bits1 local RName = bits2 local theRelic = p.getRelic(Tier, RName) if(theRelic nil) then return 'ОШИБКА: Данная реликвия не найдена' end -- if(not p.isRelicOnPlatform(theRelic, Platform)) then return "ERROR: That relic isn't on that platform" end if(not p.isRelicOnPlatform(theRelic, Platform)) then return "ОШИБКА: Эта реликвия не найдена для данной платформы" end local result = ' ' return result end function p.getRelicDrop(frame) local relicName = frame.args ~= nil and frame.args1 or nil local rarity = frame.args ~= nil and frame.args2 or nil local number = frame.args ~= nil and frame.args3 or nil if number nil then --\количество по умолчанию 1, если не указано number = 1 elseif type(number) 'string' then --Принудительное преобразование типа "строка" в "числовое" number = tonumber(number) end --Платформа как отдельный аргумент. По умолчанию для PC не указывается local platform = frame.args ~= nil and frame.args.platform or nil if platform nil then platform = 'PC' end --Возвращает ошибку при отсутствии любой требуемой переменной if relicName nil or relicName '' then return "ОШИБКА: Не задана переменная 'Название реликвии'" --Relic Name elseif rarity nil or rarity '' then return "ОШИБКА: Не задана переменная 'Категория редкости'" --Rarity end local bits = Shared.splitString(relicName, ' ') local Tier = bits1 local RName = bits2 local theRelic = p.getRelic(Tier, RName) --Возвращает ошибку если имя реликвии некорректно if theRelic nil then return "ОШИБКА: Некорректное название реликвии '"..relicName.."'" end local count = 0 for i, drop in pairs(theRelic.Drops) do --Цикл по базе реликвий для поиска Части, Чертежа в соответствии --с заданной категорией редкости if drop.Rarity rarity then count = count + 1 --В случае достижения необходимого количества возвращает Иконку + Название предмета if count number then local iName = p.getItemName(drop.Item) local pName = p.getPartName(drop.Part, false) local icon = p.getItemIconForDrop(drop) return icon..' '..iName..' '..pName..'' end end end --Если добрались до данной строки кода, значит найдено --недостаточное количество предметов заданной категории редкости return "ОШИБКА: Найдено только "..count.." предметов категории редкости "..rarity.." для реликвии "..relicName end function p.getRelicTotal(frame) local total = 0 if(Shared.contains(frame.args, "unvaulted")) then --русификация? for _,relic in pairs(VoidData"Relics") do if(relic.IsVaulted 0) then total = total + 1 end end end if(Shared.contains(frame.args, "vaulted")) then --русификация? for _,relic in pairs(VoidData"Relics") do if(relic.IsVaulted 1) then total = total + 1 end end end if(Shared.contains(frame.args, "baro")) then --русификация? for _,relic in pairs(VoidData"Relics") do if(relic.IsBaro 1) then total = total + 1 end end end if(frame.args1 nil) then total = Shared.tableCount(VoidData"Relics") end return total end local function relicData() --Поиск в базе Бездны m:VoidByReward p.byReward local data = {} for _, relic in pairs(VoidData"Relics") do for i, drop in pairs(Relic.Drops) do local newObj = {Tier = relic.Tier, Name = relic.Name, Rarity = drop.Rarity, IsVaulted = relic.IsVaulted 1, IsBaro = relic.IsBaro 1} if (datadrop.Item nil) then datadrop.Item = {} end if(datadrop.Itemdrop.Part nil) then datadrop.Itemdrop.Part = {} end table.insert(datadrop.Itemdrop.Part, newObj) end end return data end local function checkData(data) if data nil or type(data) ~= 'table' then local data = relicData() return data elseif type(data) 'table' then return data end end local function getItemRarities(itemName, partName, data) local data = checkData(data) local rarities ={} itemName = string.upper(itemName) partName = string.upper(partName) for n, drop in Shared.skpairs(dataitemNamepartName) do raritiesdrop.Rarity = true end --for rar, n in pairs(rarities) do mw.log(rar) end-- return rarities end function p.getDucatValue(frame) --This is just for invoking p._getDucatValue on article pages. local itemName = frame.args ~= nil and frame.args1 or nil local partName = frame.args ~= nil and frame.args2 or nil if itemName nil or itemName '' then return 'Имя предмета не найдено' elseif partName nil or partName '' then return 'Имя части не найдено' end return p._getDucatValue(itemName, partName) end function p._getDucatValue(itemName, partName, data) --Подсчитывает стоимость в дукатах. Некоторые не подчиняются правилу (Обычные=15, Обычные+Необычные=25, Необычные=45, Необычные+Редкие=65 и Редкие=100) поэтому их стоимость определяют вручную до вызова функции "getItemRarities" для аовышения эффективности. --A small local function for checking if the two strings match. local function uCheck(name, expected) if string.upper(name) string.upper(expected) then return true end return false end -->>>>отрихтовать<<<<<<<< if uCheck(itemName, 'Сома') and uCheck(partName, 'Чертеж') then return 15 elseif uCheck(itemName, 'Брэйтон') and uCheck(partName, 'Ствол') then --Stock return 15 elseif uCheck(itemName, 'Акстилетто') and uCheck(partName, 'Приёмник') then return 45 elseif uCheck(itemName, 'Рубико') and uCheck(partName, 'Ствол') then return 45 elseif uCheck(itemName, 'Сарина') and uCheck(partName, 'Нейрооптика Чертеж') then return 45 elseif uCheck(itemName, 'Анкирос') and uCheck(partName, 'Лезвие') then return 65 elseif uCheck(itemName, 'Рино') and uCheck(partName, 'Каркас Чертеж') then return 65 elseif uCheck(itemName, 'Валькирия') and uCheck(partName, 'Система Чертеж') then return 100 end local data = checkData(data) local rarities = getItemRarities(itemName, partName, data) local ducatValue = 0 local lenght = Shared.tableCount(rarities) --Проверка подпадает ли под обозначенную Редкость --For checking whether the table contains a dictionary of the particular rarity. local function tableContains(table, rarity) for rar, value in pairs(table) do if rar rarity then return true end end return false end --Проверка к какой Редкости принадлежит для определения корректной стоимости в Дукатах --Checking whether the lenght of table "rarities" is 1 or 2 and accordingly perform more checks to assing the correct ducat value. if lenght 1 then if rarities'Common' then return 15 elseif rarities'Uncommon' then return 45 elseif rarities'Rare' then return 100 end elseif lenght 2 then if tableContains(rarities, 'Common') then return 25 elseif tableContains(rarities, 'Rare') then return 65 end elseif lenght 3 then return 25 end return ducatValue end --Подсчет общей стоимости в Дукатах function p.getTotalDucats(frame) local tierName = frame.args ~= nil and frame.args1 local data = relicData() local totalItemCount = 0 --все предметы local withoutFormaCount = 0 --все предметы, за исключением Формы local totalDucats = 0 --всего в Дукатах local availableDucats = 0 --всего в Дукатах для всех доступных предметов local availableItems = 0 --доступные предметы local availableItemsEF = 0 --доступные предметы, за исключением Формы local vaultedDucats = 0 --всего в Дукатах для предметов из Реликвий в Хранилище local vaultedItems = 0 --предметы из Реликвий в Хранилище local vaultedItemsEF = 0 --предметы из Реликвий в Хранилище, за исключением Формы local result = '' for item, parts in Shared.skpairs(data) do for part, drops in Shared.skpairs(parts) do for n, drop in Shared.skpairs(drops) do if tierName drop.Tier or tierName nil then if drop.IsVaulted then vaultedItems = vaultedItems + 1 else availableItems = availableItems + 1 end totalItemCount = totalItemCount + 1 if item ~= 'Форма' then local tempDucat =p._getDucatValue(item, part, data) totalDucats = totalDucats + tempDucat withoutFormaCount = withoutFormaCount + 1 if drop.IsVaulted then vaultedDucats = vaultedDucats + tempDucat vaultedItemsEF = vaultedItemsEF + 1 else availableDucats = availableDucats + tempDucat availableItemsEF = availableItemsEF + 1 end end end end end end if tierName then result = "Средняя стоимость составляет: "..Icon._Item('Дукаты')..""..Shared.round((totalDucats / totalItemCount),2).." ("..totalItemCount..' наград с '..withoutFormaCount..' частями)' result = result.." Стоимость доступных составляет: "..Icon._Item('Дукаты')..""..Shared.round((availableDucats/availableItems),2).." ("..availableItems..' наград с '..availableItemsEF..' частей)' result = result.." | Запечато в Хранилище: "..Icon._Item('Дукаты')..""..Shared.round((vaultedDucats/vaultedItems),2).." ("..vaultedItems..' наград с '..vaultedItemsEF..' частей)' --<<<<<<<<<<<<<ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ else result = "Общач стоимость составляет: "..Icon._Item('Дукаты')..""..Shared.formatnum(totalDucats).." ("..totalItemCount..' наград с '..withoutFormaCount..' частей)' result = result.." Доступно: "..Icon._Item('Дукаты')..""..Shared.formatnum(availableDucats).." ("..availableItems..' наград с '..availableItemsEF..' частей)' result = result.." | Запечато в Хранилище: "..Icon._Item('Дукаты')..""..Shared.formatnum(vaultedDucats).." ("..vaultedItems..' наград с '..vaultedItemsEF..' частей)' end return result end local function ducatPriceRow(itemName, partName, tierName, data) local ducatValue = p._getDucatValue(itemName, partName, data) local sortValue = '' local function createRelicText(itemName, partName, tierName, data) itemName = string.upper(itemName) partName = string.upper(partName) local locations = {} local vaultLocations = {} for n, drop in Shared.skpairs(dataitemNamepartName) do if drop.Tier tierName or tierName nil then local dropRarity = drop.Rarity if dropRarity ~= nil then local relicText = drop.Tier.." "..drop.Name local relicString = tooltipStart..relicText..tooltipCenter..""..relicText..""..tooltipEnd.." "..dropRarity if drop.IsVaulted then relicString = relicString.." (Пр.хр.)" table.insert(vaultLocations, relicString) else if drop.IsBaro then relicString = relicString.." (Баро)" end table.insert(locations, relicString) end end end end for _, i in pairs(vaultLocations) do table.insert(locations, i) end return table.concat(locations, " ") end if itemName nil or itemName '' or partName nil or partName '' then return 'Пожалуйста введите название предметов и частей' end --first cell if partName 'Чертеж' then sortValue = itemName..' _'..partName else sortValue = itemName..' '..partName end local cell1 = '\n|data-sort-value="'..sortValue..'"|'..Icon._Prime(itemName,partName) local cell2 = '\n|'..createRelicText(itemName, partName, tierName, data) local cell3 = '\n|data-sort-value="'..ducatValue..'"|'..Icon._Item('Дукаты')..""..ducatValue.."\n|-" return cell1..cell2..cell3 end function p.ducatRelicList(frame) local data = relicData() local tierName = frame.args ~= nil and frame.args1 or nil --Adding switch to choose only vaulted or unvaulted items to show local listMode = frame.args ~= nil and frame.args2 or 'ALL' listMode = string.upper(listMode) local itemList = {} local result = {} for item, parts in Shared.skpairs(data) do if item ~= 'Форма' then for part, drops in Shared.skpairs(parts) do for i, drop in pairs(drops) do if drop.Tier tierName or tierName nil then local tempName = '' if part 'Чертеж' then tempName = Shared.titleCase(item..'<> '..part) else tempName = Shared.titleCase(item..'<>'..part) end if not Shared.contains(itemList, tempName) then if listMode 'Недоступно' then if drop.isBaro or drop.IsVaulted then table.insert(itemList, tempName) end elseif listMode 'Доступно' then if not drop.IsBaro and not drop.IsVaulted then table.insert(itemList, tempName) end else table.insert(itemList, tempName) end end end end end end end table.sort(itemList) for num, itm in pairs(itemList) do local item = Shared.splitString(itm, '<>') item1 = Shared.trim(item1) item2 = Shared.trim(item2) table.insert(result, (ducatPriceRow(item1, item2, tierName, data))) end return table.concat(result) end return p